// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database();


// 第1步引入sdk
let yly = require('yly-nodejs-sdk');

// 使用最下方注释部分：【获取token函数获得】
// {"error":"0","error_description":"success","body":{"access_token":"890299d7113245ba90e0f46284c9d02d","refresh_token":"77d52996af29489b970c13f11508324e","machine_code":"","expires_in":2592000,"scope":"all"}}
const accessToken = '890299d7113245ba90e0f46284c9d02d' //token
const machine_code = '4004601958' // 打印机终端号（在打印机底部标签） 
const img_url = 'https://graph.baidu.com/resource/10241ef1e23e19fd69cd801556074786.jpg'

//***********************************************************************************************************
'01.一二三四五六七八 ×99 ￥999.0'
/**
 * 产品内容格式化函数
 */
function name_format(name) {
  let name_length = name.length
  if (name_length >= 8) {
    return name.substr(0, 8)
  } else {
    let spaces = '' //赋值初始值为空的字符串
    let space_num = (8 - name_length) * 2 // 需要补位的空格数量
    for (let i = 1; i <= space_num; i++) {
      spaces = spaces + ' '
    }
    return name + spaces
  }
}


// 云函数入口函数
exports.main = async (event, context) => {

  //获取订单信息
  let orderId = event.orderId

  // ********************【查询数据库】********************
  let orderInfo = await db.collection('orders').where({
    orderId: orderId
  }).get()
  //------------- 错误检测-err01：数据库访问是否正常
  if (orderInfo.errMsg != 'collection.get:ok') {
    return {
      result: 'fail',
      error: 'err01:网络错误',
      more: '打印订单是连接orders数据库失败'
    }
  }
  //------------- 错误检测-err02：订单查询是否正常
  if (orderInfo.data.length !== 1) {
    return {
      result: 'fail',
      error: 'err02:查询错误',
      more: '获取订单信息时错误'
    }
  }

  let order = orderInfo.data[0] //订单详细信息 [array]

  // return {
  //   options: order.cartListData[1].options,
  //   optionsType: typeof (order.cartListData[1].options)
  // }
  // ********************【打印机设置】********************
  // 实例化一个配置对象
  let config = new yly.Config({
    'cid': '1069471136', //应用id
    'secret': '70920b025561c6d1ec24ca989d43c1a9' //应用秘钥
  });

  // 实例化远程调用的rpcClient对象
  var RpcClient = new yly.RpcClient(accessToken, config);

  // 实例化一个API对象
  var Print = new yly.Print(RpcClient);

  // ********************【模板设置】*******************
  let cartListData = order.cartListData //订单所有的产品信息

  //利用循环构造产品信息布局
  let list = ''
  for (let i = 0; i < cartListData.length; i++) {
    //'01.一二三四五六七八 ×99 ￥999.0'
    let item_price = cartListData[i].price
    let item = "<FB><LR>" +
      ('0' + (i + 1)).substr(-2) + "." +  //1.产品序号（ 3 char）
      name_format(cartListData[i].name) + //2.产品名称（16 char）
      ',' +
      ' ×' + (' ' + cartListData[i].count).substr(-2) +  //3.产品数量（ 4 char）
      ' ￥' + ('     ' + item_price.toFixed(1)).substr(-5) +  //4.产品价格（ 8 char）
      "</LR></FB>"

    let add_list = '' //每次循环小料列表清空

    //判断当前产品是否有加料
    if (cartListData[i].options !== '' && cartListData[i].additions.length > 0) {
      let nakedPrice = Number(cartListData[i].nakedPrice)
      let sub_total = //商品基本价
        "<LR>" +
        "   " + name_format(cartListData[i].name) +  //1.小料名称（19 char）
        ',' +
        ' × 1' +  //2.产品数量（ 4 char）
        ' ￥' + ('     ' + nakedPrice.toFixed(1)).substr(-5) +  //4.产品价格（ 8 char）
        "</LR>"


      for (let j = 0; j < cartListData[i].additions.length; j++) {
        let sub_item_price = cartListData[i].additions[j].addPrice
        let sub_item = "<LR>" +
          "   " + name_format(cartListData[i].additions[j].addName) +  //1.小料名称（19 char）
          ',' +
          ' × 1' +  //2.产品数量（ 4 char）
          ' ￥' + ('     ' + sub_item_price.toFixed(1)).substr(-5) +  //4.产品价格（ 8 char）
          "</LR>"
        sub_total = sub_total + sub_item
      }
      add_list = sub_total
    }

    list = list + (item + add_list)
  }

  // 配送费用
  let deliveryText = ''
  let deliveryCost = 0
  if (order.deliveryCost) { //判断是否有 deliveryCost 定义
    deliveryCost = Number(order.deliveryCost)
  }
  if (order.orderTypeName == '外卖配送') {

    //'01.一二三四五六七八 ×99 ￥999.0'
    deliveryText = "<FB><LR>" +
      "   " +  //1.产品序号（ 3 char）
      name_format("配送费") + //2.产品名称（16 char）
      ',' +
      ' ×' + (' ' + '1').substr(-2) +  //3.产品数量（ 4 char）
      ' ￥' + ('     ' + deliveryCost.toFixed(1)).substr(-5) +  //4.产品价格（ 8 char）
      "</LR></FB>"
  }
  list = list + deliveryText

  // 附加服务费
  let extraDeliveryCostText = ''
  let extraDeliveryCost = 0
  if (order.extraDeliveryCost) { //判断是否有 extraDeliveryCost 定义
    extraDeliveryCost = Number(order.extraDeliveryCost)
  }
  if (order.orderTypeName == '外卖配送' && extraDeliveryCost > 0) {

    //'01.一二三四五六七八 ×99 ￥999.0'
    extraDeliveryCostText = "<FB><LR>" +
      "   " +  //1.产品序号（ 3 char）
      name_format("附加服务费") + //2.产品名称（16 char）
      ',' +
      ' ×' + (' ' + '1').substr(-2) +  //3.产品数量（ 4 char）
      ' ￥' + ('     ' + extraDeliveryCost.toFixed(1)).substr(-5) +  //4.产品价格（ 8 char）
      "</LR></FB>"
  }
  list = list + extraDeliveryCostText

  // 配送地址
  let sendAddress = ''
  let address = order.address
  if (order.orderTypeName == '外卖配送') {
    sendAddress = "配送地址：" + address.address + ' ' + address.addNumber + ' ' + address.name
      + '(' + address.sex + ')' + ' ' + address.phone + "\r\n"
  }

  // 备注信息 
  let remark = ''

  if (order.orderRemark !== '') {
    remark = "\n@@2备注：\r\n" + order.orderRemark + '\r\n'
  }

  // 预约到店时间
  let orderType = ''
  if (order.orderTypeName == '预约到店') {
    orderType = String(order.reserveTime)+'预约到店'
  }else{
    orderType = order.orderTypeName
  }

  let origin_id = orderId
  let order_price = order.totalCost

  let content = "<audio>又有小可爱下订单啦,4,4</audio>\n" +
    "◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\r" +
    "<FS><center>就餐类型：" + orderType + "</center></FS>\n" +
    "<FS><center>取餐号：" + order.simpleId + "</center></FS>" +
    "◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\r" +
    list + remark +
    "…………………………………………\n" +
    "<FS><center>  合计:" + order.totalCount + "件   共:" + order.totalCost + "元</center></FS>" +
    "…………………………………………\n" +
    "支付方式：" + order.payType + "\r" +
    "下单时间：" + order.orderDate + ' ' + order.orderTime + "\r" +
    "用户号：" + order.userId + "\r" +
    "订单号：" + order.orderId + "\r\n" +
    "◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\r" +
    sendAddress +
    "\n\r<QR>http://weixin.qq.com/r/Ai9LU4bElNvrrcIw93oQ</QR>\r\n" +
    "<center>伐木累微山旗舰店</center>" +
    "<center>关注公众号领取更多优惠</center>"
  // ********************【执行打印】********************
  let printExe = await Print.index(machine_code, origin_id, content)

  // http请求返回结果示例：
  //{ "error": "0", "error_description": "success", "body": { "id": "245373495", "origin_id": "FML155617117704803334413" } }

  //------------- 错误检测-err03：打印请求是否成功
  if (printExe.error_description !== 'success') {
    return {
      result: 'fail',
      error: 'err03:打印请求错误',
      more: '打印请求失败'
    }
  }
  try {
    // ------------ 发送订单通知 
    await cloud.callFunction({name: 'notify', data: {orderId: orderId}})
  } catch (error) {
    console.log("尝试同步发送订单实时通知失败！", error)
  }
  //--------------运行至此，则说明无误
  return {
    result: 'success',
    error: '',
    more: ''
  }
}
//-------------------------------------------------- 获取token函数
// 实例化一个oauth2.0客户端授权模式的授权对象
// let oauthClient = new yly.OauthClinet(config);

/* 获取调用凭证token对象(返回值为一个promise)，
此步获取到的token对象可在有效期内一直使用，
不用每次调用前都去获取一次，建议应用授权一次后存放到全局缓存中
*/
// let tokenRes = await oauthClient.getToken()
// oauthClient.getToken().then(function (res) {
//   if (
//     res.error != 0 &&
//     res.error_description != 'success'
//   ) {
//     throw new Error('failed:' + res.error_description);
//   }
//   let tokenData = {
//     'accessToken': res.body.access_token,
//     'refreshToken': res.body.refresh_token,
//   };
//   if (res.body.machine_code != null) {
//     tokenData.machineCode = res.body.machine_code;
//   }
//   return tokenData
// });



//-------------------------------------------------- 设置logo
// let printer = new yly.Printer(RpcClient)
// let http_setIcon = await printer.setIcon(machine_code, img_url)
// return http_setIcon